package com.sub.project.info.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sub.project.info.prototype.Prototype;
import lombok.Data;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

@Data
public class RestVo  implements Prototype {

    //  TODO id
    private Long id;

    // TODO 名称
    private String name;

    // TODO 内容
    private String content;

    // TODO 备注
    private String remarks;

    // TODO 开始时间
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date startTime;

    //TODO 结束时间
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date endTime;

    @Override
    public Prototype clone() {
        RestVo restVo = new RestVo();
        restVo.setContent(this.content);
        restVo.setId(this.id);
        restVo.setName(this.name);
        restVo.setRemarks(this.remarks);
        restVo.setStartTime(this.startTime);
        restVo.setEndTime(this.endTime);
        return restVo;
    }

    public static Object copy(Object source){
        //创建一个新的对象(空对象)
        Object target=null;
        try {
            Class clz=source.getClass();//获取源对象的class对象
            target=clz.newInstance();//源对象必须有空的构造器
            //获取类中的所有属性
            Field[] fields=clz.getDeclaredFields();
            for (Field field : fields) {
                //获取属性名
                String fieldName=field.getName();
                //根据属性名称获取setter/getter方法名
                String set="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                String get="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                //根据方法名称获取方法对象
                Method method_set=clz.getMethod(set, field.getType());
                Method method_get=clz.getMethod(get);
                //执行源对象的get方法，获取返回值
                Object returnVal=method_get.invoke(source);
                //执行目标对象的set方法，将源对象方法的返回值作为参数设置给目标对象
                method_set.invoke(target, returnVal);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return target;
    }


}
